package com.example.vulnerableapplication.Activity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.vulnerableapplication.R;
import com.example.vulnerableapplication.tool.FileUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;

import dalvik.system.DexClassLoader;

public class setExtrasClassLoader  extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_classloader);


        Button btn_setExtrasClassLoader = findViewById(R.id.setExtrasClassLoader);
        btn_setExtrasClassLoader.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loadDexClass();
            }
        });

    }

    private void loadDexClass() {
        // getDir("dex1", 0)会在/data/data/**package/下创建一个名叫”app_dex1“的文件夹，其内存放的文件是自动生成output.dex
        File OutputDir = FileUtils.getCacheDir(getApplicationContext());
        String dexPath = OutputDir.getAbsolutePath() + File.separator + "1.jar";

        File desFile = new File(dexPath);
        try {
            if (!desFile.exists()) {
                desFile.createNewFile();
                FileUtils.copyFiles(this, "1.jar", desFile);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         * 参数1 dexPath：待加载的dex文件路径，如果是外存路径，一定要加上读外存文件的权限
         * 参数2 optimizedDirectory：解压后的dex存放位置，此位置一定要是可读写且仅该应用可读写（安全性考虑），所以只能放在data/data下。
         * 参数3 libraryPath：指向包含本地库(so)的文件夹路径，可以设为null
         * 参数4 parent：父级类加载器，一般可以通过Context.getClassLoader获取到，也可以通过ClassLoader.getSystemClassLoader()取到。
         */
        DexClassLoader classLoader = new DexClassLoader(dexPath, OutputDir.getAbsolutePath(), null, getClassLoader());
        Intent intent = setExtrasClassLoader.this.getIntent();
        intent.setExtrasClassLoader(classLoader);
        try {
//            该方法将Class文件加载到内存时,并不会执行类的初始化,直到这个类第一次使用时才进行初始化.该方法因为需要得到一个ClassLoader对象
//            Class clz = classLoader.loadClass("cn.test.wifiexploit.ShellP");
//            Field inTarget = clz.getDeclaredField("inTarget");
//            inTarget.setAccessible(true);
//            Log.e("Rzx","classLoader.loadClass"+inTarget.get(null));

//            IDex dex = (IDex) clz.newInstance();
//            Toast.makeText(this, dex.getMessage(), Toast.LENGTH_LONG).show();
            String ret = intent.getStringExtra("activityImplName");
            Log.e("Rzx","getIntExtra:"+ret);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
